Technote 1119

Serial Port Apocrypha


ñ⁄éü

óºAPIÇÃã§í ì_

ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPI

Open TransportÇÃAPI

óºÉAÅ[ÉrÉgÉåÅ[É^ÇÃï®åÍ

óvñÒ
DZÇÃÉeÉbÉNÉmÅ[ÉgÇÕMac OSè„Ç≈ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈç€ÇÃólÅXÇ»íçà”éñçÄDžǬǢǃâê‡ÇµÇ‹Ç∑ÅBDZÇÃÉeÉbÉNÉmÅ[ÉgÇ…ãLç⁄Ç≥ÇÍǃǢÇÈèÓïÒÇÕëºÇ≈LJåˆäJÇ≥ÇÍǃǢNjÇ∑Ç™ÅADZDZÇ≈ÇÕÇ∑Ç◊ǃÇÃíçà”ì_ÇàÍâ”èäÇ…Ç‹ÇΔÇflǃǢNjÇ∑ÅB

ãÔëÃìIÇ…ÇÕÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇΔOpen TransportÇÃAPIÇégǡǃÅAÉVÉäÉAÉãÉ|Å[ÉgñºÇÃéÊìæÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃÉIÅ[ÉvÉìÅAÉNÉçÅ[ÉYÅAǪǵǃè˜ÇÈç€ÇÃê≥ǵǢï˚ñ@Çê‡ñæÇµÇ‹Ç∑ÅBÇ‹ÇΩÅAãåÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç‚Open TransportÇÃÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃê›åvÇΔégÇ¢ï˚Çâê‡ÇµÇ‹Ç∑ÅB

DZÇÃÉeÉbÉNÉmÅ[ÉgÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÇ∑Ç◊ǃÇÃÉfÉxÉçÉbÉpÇ™ëŒè€Ç≈Ç∑ÅB


óºAPIÇÃã§í ì_

Mac OSÇ≈ÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÇΩÇflÇÃAPIÇ™2ǬdžÇËÇ‹Ç∑ÅBÉfÉoÉCÉXÉ}ÉlÅ[ÉWÉÉÇÃ'DRVR'ÉhÉâÉCÉoÇå≥DžǵÇΩãåAPIÅiInside Macintosh: DevicesÇéQèΔÅjÇΔOpen TransportÇÃAPIÅiInside Macintosh: Open TransportÇéQèΔÅjÇ≈Ç∑ÅBà»â∫ÇÃ2ì_ÇÕóºAPIÇ™ëŒè€Ç≈Ç∑ÅB

ïKóvÇ»éûÇæÇØÉIÅ[ÉvÉìÅ^ÉNÉçÅ[ÉY

ÉRÉìÉsÉÖÅ[É^ÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÕìØéûégópÇÃÇ≈ǴǻǢÉäÉ\Å[ÉXÇ≈Ç∑ÅBàÍǬÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇÉIÅ[ÉvÉìǵǃǢÇÈå¿ÇËÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕǪÇÃÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ≈Ç´Ç‹ÇπÇÒÅBDZÇÃÇΩÇflÅAÉVÉäÉAÉãÉ|Å[ÉgÇÕïKóvÇ»éûÇæÇØÉIÅ[ÉvÉìǵǃÅAégÇ¢èIÇÌÇ¡ÇΩÇÁÉNÉçÅ[ÉYÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ó·Ç¶ÇŒÅAÉÜÅ[ÉUìoò^ÇÃàÍä—ÇΔǵǃÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÇÊǧǻÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉÜÅ[ÉUìoò^ÇÃäJéníºëOÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇÉIÅ[ÉvÉìǵǃÅAégÇ¢èIÇÌÇ¡ÇΩÇÁÇ∑ÇÆÇ…ÉNÉçÅ[ÉYǵNjÇ∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈ

ÉVÉäÉAÉãÉ|Å[ÉgÇÕéÛêgìIÇ…óòópÇ∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅBDZÇÃèÍçáÅAÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵÇΩÇ¢ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ©ÇÁóvãÅǙdžÇÍÇŒÅAÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅBǪǵǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇégÇ¢èIÇÌÇ¡ÇΩÇÁÅAçƒÇ—ÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópÇ≈Ç´Ç‹Ç∑ÅB

ó·Ç¶ÇŒÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÅiÉoÅ[ÉWÉáÉì2.1à»ëOÅjÇë“ÇøéÛÇØèÛë‘Ç…ÉZÉbÉgǵǃLJÅAFreePPPǻǫÇ≈PPPê⁄ë±Ç™çsǶNjÇ∑ÅBDZÇÍÇÕÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇ™FreePPPÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇè˜Ç¡ÇƒÇ¢ÇÈÇ©ÇÁÇ≈Ç∑ÅBFreePPPÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇï¬Ç∂ÇÈÇΔÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÕçƒÇ—ÉVÉãÉAÉãÉ|Å[ÉgÇ…ÉAÉNÉZÉXǵǃÅAë“ÇøéÛÇØèÛë‘ÇΔÇ»ÇËÇ‹Ç∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPI

ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇÕInside Macintosh: DevicesÇ…ãLèqÇ≥ÇÍǃǢÇÈí ÇËÅAÉfÉoÉCÉXÉ}ÉlÅ[ÉWÉÉÇÃÉhÉâÉCÉo'DRVR'Çå≥DžǵǃǢNjÇ∑ÅBDZDZÇ≈ÇÕÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇ≈ÉVÉäÉAÉãÉ|Å[ÉgñºÇÃéÊìæÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃÉIÅ[ÉvÉìÅAÉNÉçÅ[ÉYÅAǪǵǃè˜ÇÈç€ÇÃê≥ǵǢï˚ñ@Çê‡ñæÇµÇ‹Ç∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgñºÇÃéÊìæ

ì¡íËÇÃÉRÉìÉsÉÖÅ[É^Ç≈óòópÇ≈Ç´ÇÈÉVÉäÉAÉãÉ|Å[ÉgÇÃàÍóóÇìæÇÈÇ…ÇÕCommunications ToolboxÇÃàÍïîÇ≈džÇÈCommunications Resource ManagerÅiCRMÅjÇÃCRMSearch ()ä÷êîÇóòópǵNjÇ∑ÅBécîOǻǙÇÁÅACommunications Resource ManagerÇÃï∂å£ÅiInside the Macintosh Communications ToolboxÅjÇÕÉIÉìÉâÉCÉìÇ≈Ç≤óóÇ…Ç»ÇÍǻǢÇÃÇ≈ÅACRMSearch ()DžǬǢǃÇÃê‡ñæÇíTÇ∑ÇÃÇ…ãÍòJÇ∑ÇÈǩLJǵÇÍÇ‹ÇπÇÒÅBDZDZÇ≈ÇÕCRMSearch ()ÇóòópÇ∑ÇÈç€ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇópà”ǵNjǵÇΩÇÃÇ≈ÅAéQçlDžǵǃâ∫Ç≥Ç¢ÅB



static void PrintInfoAboutAllSerialPorts (void)
//  DZÇÃÉRÉìÉsÉÖÅ[É^Ç≈óòópÇ≈Ç´ÇÈÉVÉäÉAÉãÉ|Å[ÉgÇÃÉäÉXÉg
//  ÇèoóÕǵNjÇ∑ÅBÉVÉäÉAÉãÉ|Å[ÉgñºÅAì¸óÕÉhÉâÉCÉoñºÅA
//  èoóÕÉhÉâÉCÉoñºÇstdoutÇ…èoóÕǵNjÇ∑ÅBàÍî ìIÇ…ÇÕà»â∫
//  ÇÃÇÊǧǻÉRÅ[ÉhÇégǡǃÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃÉ|ÉbÉvÉAÉbÉv
//  ÉÅÉjÉÖÅ[Çç\ízǵNjÇ∑ÅB
{
    CRMRec commRecord;
    CRMRecPtr thisCommRecord;
    CRMSerialPtr serialPtr;

    (void) InitCRM ();
     
    //  ÉVÉäÉAÉãÉ|Å[ÉgÇÃÇ›Çï‘Ç∑ÇÊǧÅAcommRecordÇê›íËǵNjÇ∑ÅB

    commRecord.crmDeviceType = crmSerialDevice;
    commRecord.crmDeviceID = 0;
  
    //  CRMSearch ()ÇåJÇËï‘ǵåƒÇ—èoǵǃÅAÇ∑Ç◊ǃÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÃ
    //  èÓïÒÇìæÇ‹Ç∑ÅB
  
    thisCommRecord = &commRecord;
    do {
        thisCommRecord = (CRMRecPtr) CRMSearch ((CRMRecPtr) thisCommRecord);
        if (thisCommRecord != nil) {
             
            //  ÉVÉäÉAÉãÉ|Å[ÉgÇÃCRMRecÇìæÇΩÇÁÅAcrmAttributesÉtÉBÅ[ÉãÉhÇ
            //  CRMSerialPtrÇ…ÉLÉÉÉXÉgǵǃÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃèÓïÒÉtÉBÅ[ÉãÉhÇ…
            //  ÉAÉNÉZÉXǵNjÇ∑ÅB
  
             serialPtr = (CRMSerialPtr) thisCommRecord->crmAttributes;
  
            //  DZÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÃèÓïÒÇèoóÕÇ∑ÇÈÅB
             
            printf ("We have a port called: "%#s"\n", *(serialPtr->name));
            printf ("   input driver named: "%#s"\n", *(serialPtr->inputDriverName));
            printf ("  output driver named: "%#s"\n", *(serialPtr->outputDriverName));
            printf ("\n");
  
            //  CRMSearch ()Ç™éüÇÃÉfÉoÉCÉXÇï‘Ç∑ÇÊǧDžéwíËÇ∑ÇÈÅB
             
            commRecord.crmDeviceID = thisCommRecord->crmDeviceID;
        }
    } while (thisCommRecord != nil);
}

?/TD>
íêÅF
CRMÇÕÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÉoÅ[ÉWÉáÉì7.0à»ç~Ç…ïWèÄìãç⁄Ç≥ÇÍǃǢNjÇ∑ÅBÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÉoÅ[ÉWÉáÉì6Ç≈ÇÕÉIÉvÉVÉáÉìÇ»ÇÃÇ≈ÅAÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÉoÅ[ÉWÉáÉì6Ç≈ìÆçÏÇ∑ÇÈêªïiÇäJî≠Ç∑ÇÈèÍçáÇÕCRMÇ™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBGestalt ()ä÷êîÇÃgestaltCRMAttrÉZÉåÉNÉ^ÇégǡǃÅAgestaltCRMPresentÉtÉâÉOÇ™ÉZÉbÉgÇ≥ÇÍǃǢÇÈDZÇΔÇämîFǵǃâ∫Ç≥Ç¢ÅB

èdóvÅF
CRMÇ…ìoò^Ç≥ÇÍǃǢÇÈÉVÉäÉAÉãÉ|Å[ÉgÇÕïWèÄÇÃÉVÉäÉAÉãÉ|Å[ÉgÇΔìØÇ∂ÇÊǧDžìÆçÏÇ∑ÇÈÇÕÇ∏Ç≈Ç∑ÅBǵǩǵÅAïWèÄÉVÉäÉAÉãÉ|Å[ÉgÇÃìÆçÏÇåµñßÇ…çƒåªÇ≈ǴǻǢèÍçáǙdžÇËÇ‹Ç∑ÅiÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^Ç‚ÉTÅ[ÉhÉpÅ[ÉeÉBÇÃêªïiÇä‹ÇfiÅjÅBCRMÇ…ìoò^Ç≥ÇÍǃǢÇÈÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈèÍçáÇÕDZÇÃÇÊǧǻêßå¿Ç…íçà”ǵǃâ∫Ç≥Ç¢ÅBó·Ç¶ÇŒÅAMIDIånÇÃäOïîÉNÉçÉbÉNÉÇÅ[ÉhÅicsCode 15ÅjÇóòópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉVÉäÉAÉãÉ|Å[ÉgÇ™äOïîÉNÉçÉbÉNÉÇÅ[ÉhÇéÛÇØïtÇØÇ»Ç¢éñë‘LJëzíËǵǃê›åvÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB


ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉIÅ[ÉvÉì

ÉVÉäÉAÉãÉ|Å[ÉgÇÃê≥ǵǢÉIÅ[ÉvÉìÇÃédï˚ÇÕMac OS SDKÇÃCDÇ…ä‹Ç‹ÇÍǃǢÇÈARA APIÇÃï∂å£Ç…ãLèqÇ≥ÇÍǃǢNjÇ∑ÅBǵǩǵÅAdžNjÇËDžLJêlñ⁄DžǬǩǻǢï∂å£Ç»è„Ç…ÉTÉìÉvÉãÉRÅ[ÉhLJå√Ç¢ÇÃÇ≈ÅAà»â∫Ç…ìØÇ∂ì‡óeÇçƒìxãLèqǵNjÇ∑ÅB

ÉãÅ[ÉãÇÕéäǡǃä»íPÇ≈Ç∑ÅF

ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™ë∂ç›Ç∑ÇÈèÍçáÇÕOpenDriver ()Çíºê⁄åƒÇ—èoǵǃÉVÉäÉAÉãÉ|Å[ÉgÇäJÇØÅBë∂ç›ÇµÇ»Ç¢èÍçáÇÕÉÜÉjÉbÉgÉeÅ[ÉuÉãÇéQèΔǵǃÅAÉhÉâÉCÉoÇ™ä˘Ç…äJǢǃǢǻǢèÍçáÇæÇØÉVÉäÉAÉãÉ|Å[ÉgÇäJÇØÅB

à»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇ≈ÇÕDZÇÃÉãÅ[ÉãÇ…è]ǡǃÉVÉäÉAÉãÉ|Å[ÉgÇäJǢǃǢNjÇ∑ÅB


static OSErr OpenOneSerialDriver (ConstStr255Param driverName, short *refNum)
//  ÉVÉäÉAÉãÉhÉâÉCÉoÇÃê≥ǵǢÉIÅ[ÉvÉìÇÃédï˚ÅBÇ‹Ç∏ÅAÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™
//  ë∂ç›Ç∑ÇÈǩǫǧǩÇämîFǵNjÇ∑ÅBë∂ç›Ç∑ÇÈèÍçáÇÕǢǴǻÇËOpenDriver ()Ç
//  åƒÇ—èoǵǃÅAÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç…îªífÇîCÇπÇ‹Ç∑ÅBÉVÉäÉAÉã
//  ÉAÅ[ÉrÉgÉåÅ[É^Ç™ë∂ç›ÇµÇ»Ç¢èÍçáÇÕÉÜÉjÉbÉgÉeÅ[ÉuÉãÇå©ÇƒÅAÉhÉâÉCÉoÇ™ä˘Ç…
//  äJǢǃǢÇÈǩǫǧǩÇämîFǵNjÇ∑ÅB
{
    OSErr err;

    if (SerialArbitrationExists ()) {
        err = OpenDriver (driverName, refNum);
    } else {
        if (DriverIsOpen (driverName)) {
            err = portInUse;
        } else {
            err = OpenDriver (driverName, refNum);
        }
    }
    return err;
}
  
static OSErr OpenSerialDrivers (ConstStr255Param inName, ConstStr255Param outName, 
                                SInt16 *inRefNum, SInt16 *outRefNum)
//  ÉVÉäÉAÉãÉ|Å[ÉgÇÃì¸óÕÇΔèoóÕÉhÉâÉCÉoÇÉIÅ[ÉvÉìǵǃÅAäeÅXÇÃrefNumÇï‘ǵNjÇ∑ÅB
//  Ç«ÇøÇÁÇ©ÇÃÉhÉâÉCÉoÇ™ÉIÅ[ÉvÉìÇ≈ǴǻǩǡÇΩèÍçáÇÕrefNumÇ™óºï˚ÇΔLJÉ[ÉçÇΔÇ»ÇËÇ‹Ç∑ÅB
{
    OSErr err;
     
    err = OpenOneSerialDriver (outName, outRefNum);
    if (err == noErr) {
        err = OpenOneSerialDriver (inName, inRefNum);
        if (err != noErr) {
            (void) CloseDriver (*outRefNum);
        }
    }
    if (err != noErr) {
        *inRefNum = 0;
        *outRefNum = 0;
    }
    return err;
}


?/TD> è„ãLÇÃÉTÉìÉvÉãÉRÅ[ÉhÇ≈ÇÕÅAèoóÕÉhÉâÉCÉoÇêÊÇ…ÉIÅ[ÉvÉìǵǃǢNjÇ∑ÅBïWèÄÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoǂǪÇÃëºÇÃCRMìoò^ÉhÉâÉCÉoÇÉIÅ[ÉvÉìÇ∑ÇÈèÍçáÇÕèoóÕÉhÉâÉCÉoÇêÊÇ…ÉIÅ[ÉvÉìǵǃâ∫Ç≥Ç¢ÅBDZÇÍÇÕÅAèoóÕÉhÉâÉCÉoÇ™ÉVÉXÉeÉÄÉäÉ\Å[ÉXÇÃämï€Ç‚ÉVÉäÉAÉãÉ|Å[ÉgÇÃóòópèÛãµÇÃämîFÇçsǡǃǢÇÈÇ©ÇÁÇ≈Ç∑ÅBïWèÄÉVÉäÉAÉãÉ|Å[ÉgÇÃèÍçáÅAèoóÕÉhÉâÉCÉoÇ™ÉGÉâÅ[Ç»Ç≠ÉIÅ[ÉvÉìÇ≈Ç´ÇΩÇÁÅAì¸óÕÉhÉâÉCÉoLJïKÇ∏ÉIÅ[ÉvÉìÇ≈Ç´ÇÈÇÕÇ∏Ç≈Ç∑ÅBÇΩÇæÇµÅACRMÇ…ìoò^Ç≥ÇÍǃǢÇÈÉhÉâÉCÉoÇ™Ç∑Ç◊ÇƒÇªÇ§ÇæÇΔÇÕå¿ÇÁǻǢÇÃÇ≈ÅAïKÇ∏OpenDriver ()ÇÃï‘Ç∑ílÇÉ`ÉFÉbÉNǵǃâ∫Ç≥Ç¢ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™ë∂ç›Ç∑ÇÈǩǫǧǩÇÕà»â∫ÇÃÇÊǧDžîªífǵNjÇ∑ÅB

enum {
    gestaltSerialPortArbitratorAttr = 'arb ',

    gestaltSerialPortArbitratorExists = 0
};
  
static Boolean SerialArbitrationExists(void)
//  Gestalt ()ä÷êîÇégǡǃÅAÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ǙDZÇÃ
//  ÉRÉìÉsÉÖÅ[É^Ç≈ë∂ç›Ç∑ÇÈǩǫǧǩÇämîFǵNjÇ∑ÅB
{
    Boolean result;
    long response;
     
    result = (Gestalt (gestaltSerialPortArbitratorAttr, &response) == noErr &&
              (response & (1 << gestaltSerialPortArbitratorExists) != 0) != 0));
    return result;
}


ç≈å„Ç…ïKóvÇ»ÇÃÇÕÅADriverIsOpen ()ÇΔåæÇ§ä÷êîÇ≈Ç∑ÅBDZÇÃä÷êîÇÕÉfÉoÉCÉXÇÃÉÜÉjÉbÉgÉeÅ[ÉuÉãÇéQèΔǵǃÅAì¡íËÇÃÉVÉäÉAÉãÉhÉâÉCÉoÇ™ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÇämîFǵNjÇ∑ÅBDZÇÃä÷êîÇÕÉçÅ[ÉÅÉÇÉäïœêîÇíºê⁄óòópǵǃǢÇÈÇΩÇfló«Ç¢ÉRÅ[Éhó·ÇΔÇÕåæÇ¶Ç‹ÇπÇÒÇ™ÅAÉVÉãÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™ë∂ç›ÇµÇ»Ç¢èÍçáÇÃÇ›é¿çsÇ≥ÇÍÇÈÇÃÇ≈ÅAdžNjÇËóòópÇ≥ÇÍǻǢDZÇΔÇä˙ë“Ç≈Ç´Ç‹Ç∑ÅB


static Boolean DriverIsOpen (ConstStr255Param driverName)
//  éwíËÇ≥ÇÍÇΩÉhÉâÉCÉoÇÉÜÉjÉbÉgÉeÅ[ÉuÉãì‡Ç≈íTǵèoǵǃÅA
//  ä˘Ç…ÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÍÇŒtrueÇï‘ǵNjÇ∑ÅBÉhÉâÉCÉoÇ™
//  ÉIÅ[ÉvÉìÇ≥ÇÍǃǢǻǢèÍçáÇ‚ë∂ç›ÇµÇ»Ç¢èÍçáÇÕfalseÇ
//  ï‘ǵNjÇ∑ÅB
{
    Boolean found;
    Boolean isOpen;
    short unit;
    DCtlHandle dceHandle;
    StringPtr namePtr;
     
    found = false;
    isOpen = false;
     
    unit = 0;   
    while (!found && (unit < LMGetUnitTableEntryCount ())) {
     
        //  Device Control EntryÇÃÉnÉìÉhÉãÇìæÇÈÅBGetDCtlEntry ()
        //  ÇÕÉhÉâÉCÉorefNumÇéÛÇØïtÇØÇÈÇÃÇ≈ÅANOTÇégǡǃ
        //  ÉÜÉjÉbÉgî‘çÜÇ©ÇÁìæÇ‹Ç∑ÅB
         
        dceHandle = GetDCtlEntry (~unit);

        if (dceHandle != nil && (**dceHandle).dCtlDriver != nil) {
         
            //  RAMÉxÅ[ÉXÉhÉâÉCÉoÇÃèÍçáÅAdCtlDriverÇÕÉnÉìÉhÉãÇ≈Ç∑ÅB
            //  ǪÇÍà»äOÇÃèÍçáÇÕÉ|ÉCÉìÉ^àµÇ¢Ç≈Ç∑ÅB
             
            if (((**dceHandle).dCtlFlags & dRAMBasedMask) != 0) {
                namePtr = &(**((DRVRHeaderHandle) (**dceHandle).dCtlDriver)).drvrName [0];
            } else {
                namePtr = &(*((DRVRHeaderPtr) (**dceHandle).dCtlDriver)).drvrName [0];
            }
     
            //  ÉhÉâÉCÉoñºÇÃÉ|ÉCÉìÉ^ÇìæÇΩÇÁÅAÉIÅ[ÉvÉìÇ≥ÇÍǃǢÇÈǩǫǧǩÇÕ
            //  ÉtÉâÉOÇéQèΔǵǃämîFǵNjÇ∑ÅB
             
            if (EqualString (driverName, namePtr, false, true)) {
                found = true;
                isOpen = ((**dceHandle).dCtlFlags & dOpenedMask) != 0;
            }
        }
        unit += 1;
    }
    return isOpen;
}

?/TD>

íêÅF
ÉçÅ[ÉÅÉÇÉäÉAÉNÉZÉXä÷êîLMGetUnitTableEntryCount ()ÇÕ"LoMem.h"Ç≈íËã`Ç≥ÇÍǃǢNjÇ∑Ç™ÅAInterfaceLibÇ≈ÇÕÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢNjÇπÇÒÅBUniversal Interfaces 2.xÇå≥Ç…CFMÉRÅ[ÉhÇÉrÉãÉhǵÇÊǧÇΔÇ∑ÇÈÇΔÉäÉìÉNÇÃç€Ç…ÉGÉâÅ[ÇΔÇ»ÇËÇ‹Ç∑ÅBDZÇÃèÍçáÇÕÉçÅ[ÉÅÉÇÉäÉAÉNÉZÉXä÷êîÇìΔé©Ç…èëÇ≠Ç©ÅAêVÇΩÇ…É}ÉNÉçÇ™â¡Ç¶ÇÁÇÍÇΩUniversal Interfaces 3.xÇÇ®égÇ¢â∫Ç≥Ç¢ÅB


ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉNÉçÅ[ÉY

ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉIÅ[ÉvÉìÇ…ê¨å˜ÇµÇΩÇÁÅAégÇ¢èIÇÌÇ¡ÇΩéûì_Ç≈ïKÇ∏ÉNÉçÅ[ÉYǵǃâ∫Ç≥Ç¢ÅBÉVÉäÉAÉãÉ|Å[ÉgÇÃÉNÉçÅ[ÉYÇÕCloseDriver ()Ç≈çsǢNjÇ∑ÅBÇ‹ÇΩÅAì¸óÕÇΔèoóÕÉhÉâÉCÉoÇÃóºï˚ÇÉNÉçÅ[ÉYÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBà»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÕÉVÉäÉAÉãÉ|Å[ÉgÇÃê≥ǵǢÉNÉçÅ[ÉYÇÃédï˚Ç≈Ç∑ÅB

static OSErr CloseSerialDrivers(SInt16 inRefNum, SInt16 outRefNum)
 {
     OSErr err;
  
     (void) KillIO(inRefNum);
     err = CloseDriver(inRefNum);
     if (err == noErr) {
         (void) KillIO(outRefNum);
         (void) CloseDriver(outRefNum);
     }
     
     return err;
 }


ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ê≥èÌèIóπǵǻǩǡÇΩèÍçáÇ≈LJÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇÕÉNÉçÅ[ÉYǵǃâ∫Ç≥Ç¢ÅBÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇÉNÉçÅ[ÉYǵǻǢNjNjÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™èIóπǵǃǵNjǧÇΔÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉRÉìÉsÉÖÅ[É^ÇçƒãNìÆÇ∑ÇÈÇ‹Ç≈ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ≈Ç´Ç‹ÇπÇÒÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ê≥èÌèIóπǵǻǩǡÇΩèÍçáÇ≈LJÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇämé¿Ç…ÉNÉçÅ[ÉYÇ∑ÇÈï˚ñ@ÇÕà»â∫ÇÃÇÊǧǻLJÇÃǙdžÇËÇ‹Ç∑ÅB

  • CFMÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍçáÇÕÅACFMÉtÉâÉOÉÅÉìÉgÇÃèIóπä÷êîÇégǡǃÉVÉäÉAÉãÉ|Å[ÉgÇÃÉNÉçÅ[ÉYÇ™â¬î\Ç≈Ç∑ÅBè⁄ǵÇ≠ÇÕInside Macintosh: PowerPC System SoftwareÇÇ≤óóâ∫Ç≥Ç¢ÅB
  • Thread ManagerÇ™ë∂ç›Ç∑ÇÈèÍçáÇÕÅASetThreadTerminator ()Ç≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉÅÉCÉìÉXÉåÉbÉhÇÃèIóπä÷êîÇéwíËÇ∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅB
  • è„ãLÇÃï˚ñ@Ç™égǶǻǢèÍçáÇ≈LJÅAExitToShell ()ÇÉpÉbÉ`Ç∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅB

íêÅF
Inside Macintosh II Åi247Å`250ÉyÅ[ÉWÅjÇÕRAMÇΔROMÇÃÉVÉäÉAÉãÉhÉâÉCÉoÇÃà·Ç¢Ç‚RAMSDOpen ()ÇΔRAMSDClose ()DžǬǢǃâê‡ÇµÇƒÇ¢Ç‹Ç∑Ç™ÅAåªç›ÇÃMac OSÇ…ÇÕìKâûǵǻǢÇÃÇ≈ÅADZÇÍÇÁÇÃãLèqÇÕñ≥éãǵǃâ∫Ç≥Ç¢ÅB


ÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈ

ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇ≈ÇÕÅAÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópǵǃÉ_ÉCÉiÉ~ÉbÉNÇ…ëºÉvÉçÉOÉâÉÄÇ…è˜ÇÈDZÇΔÇ…ä÷ǵǃÅAÇŸÇΔÇÒÇ«ÉTÉ|Å[ÉgÇ≥ÇÍǃǢǻǢÇΔçlǶǃó«Ç¢Ç≈ǵÇÂǧÅBAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÕLink Tool ManagerÇÃAPIÇégǡǃÉVÉäÉAÉãÉ|Å[ÉgÇä«óùǵǃǢNjÇ∑Ç™ÅAÉAÉbÉvÉãÉRÉìÉsÉÖÅ[É^ÇÕDZÇÃAPIÇåˆäJǵǃǢNjÇπÇÒÇÃÇ≈ÅAóòópÇ∑ÇÈDZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópǵǃäéǬëºÉvÉçÉZÉXÇ…è˜ÇÈïKóvǙdžÇÈèÍçáÇÕOpen TransportÇÃÉVÉäÉAÉãÉ|Å[ÉgAPIÇégǡǃâ∫Ç≥Ç¢ÅB

Open TransportÇÃAPI

Mac OSè„ÇÃÉVÉäÉAÉãí êMÇÃLJǧàÍǬÇÃAPIÇÕÉlÉbÉgÉèÅ[ÉNä÷åWÇÃAPIÇΔÇÊÇ≠éóǃǢÇÈOpen TransportÇÃAPIÇ≈Ç∑ÅBOpen TransportÇÃåªÉoÅ[ÉWÉáÉìÅiDZÇÃÉeÉbÉNÉmÅ[ÉgÇ™èëÇ©ÇÍÇΩéûÇÕ1.3ÅjÇÕÅAãåÉVÉäÉAÉãÉhÉâÉCÉoÇÃè„Ç≈ìÆÇ≠ÉåÉCÉÑÅ[ÇΔǻǡǃǢNjÇ∑ÅBǬNjÇËÅAÇ«ÇøÇÁÇÃAPIÇégǡǃLJÅAÉVÉäÉAÉãÉ|Å[ÉgÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìä‘Ç≈ǧNjÇ≠ã§óLÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

Open TransportÇÃàÍî ìIÇ»ê‡ñæÇ…ǬǢǃÇÕInside Macintosh: Open TransportÇÇ≤óóâ∫Ç≥Ç¢ÅB

ÉVÉäÉAÉãÉ|Å[ÉgñºÇÃéÊìæ

Open TransportÇÃÉVÉäÉAÉãí êMAPIÇégǧèÍçáÇÕÅAOTGetIndexedPort ()ÇÉãÅ[ÉvÇ≈åƒÇ—èoǵǃÅAÉ|Å[ÉgéÌï Ç™kOTSerialDeviceÇÃï®ÇíTǵNjÇ∑ÅBà»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÇ≤óóâ∫Ç≥Ç¢ÅB

static OSStatus PrintSerialPortInfo (const OTPortRecord *portRecord)
//  portRecordÇÃÉVÉäÉAÉãÉ|Å[ÉgèÓïÒÇèoóÕǵNjÇ∑ÅB
{
    Str255 userVisibleName;
     
    //  OTGetUserPortNameFromPortRef ()ÇÕ<OpenTptConfig.h>Ç≈íËã`Ç≥ÇÍǃǢÇÈÅA
    //  džNjÇËímÇÁÇÍǃǢǻǢä÷êîÇ≈Ç∑ÅBǵǩǵÅAOpen TransportÇÃÉ|Å[ÉgñºÇ
    //  ìæÇÈÇÃÇ…îÒèÌÇ…ï÷óòÇ≈Ç∑ÅB
     
    OTGetUserPortNameFromPortRef (portRecord->fRef, userVisibleName);
     
    printf ("Found a serial port with port reference $%08lx:\n", portRecord->fRef);
    printf ("  User visible name is                       "%#s".\n", userVisibleName);
    printf ("  String to pass to OTCreateConfiguration is "%s".\n",  portRecord->fPortName);
    printf ("  Name of provider module is                 "%s".\n",  portRecord->fModuleName);
    printf ("\n");
     
    return kOTNoError;
}
  
static OSStatus OTFindSerialPorts (void)
//  Open TransportÇégǡǃÅAóòópâ¬î\Ç»ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉäÉXÉgÇèoóÕǵNjÇ∑ÅB
{
    OSStatus err;
    Boolean portValid;
    SInt32 portIndex;
    OTPortRecord portRecord;
    UInt16 deviceType;

    //  portIndexÇÕÉ[ÉçÇ©ÇÁäJénǵǃÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃêîÇí¥Ç¶ÇÈÇ‹Ç≈ÅA
    //  OTGetIndexedPort ()ÇåƒÇ—èoǵNjÇ∑ÅB

    portIndex = 0;
    err = kOTNoError;
    do {
        portValid = OTGetIndexedPort (&portRecord, portIndex);
        if (portValid) {

            //  óLå¯Ç»É|Å[ÉgDžǬǢǃÅAéÌï ÇìæÇ‹Ç∑ÅBÉVÉäÉAÉãÉ|Å[ÉgÇ≈džÇÍÇŒÅA
            //  ÉGÉCÉäÉAÉXÇ≈ÇÕǻǢDZÇΔÇæÇØämîFǵǃÅAPrintSerialPort ()Ç
            //  åƒÇ—èoǵǃÅAÉ|Å[ÉgèÓïÒÇèoóÕǵNjÇ∑ÅBÉGÉCÉäÉAÉXLJä‹ÇÒÇ≈ǵNjǧÇΔ
            //  ïWèÄÉfÉXÉNÉgÉbÉvã@ÇÃèÍçáÇÕ3ǬÇÃÉVÉäÉAÉãÉ|Å[ÉgÇ™èoóÕÇ≥ÇÍÇ‹Ç∑ÅF
            //  ÅuserialAÅvÅAÅuserialBÅvÅAÅuserialÅvÅB
         
            deviceType = OTGetDeviceTypeFromPortRef (portRecord.fRef);
            if (deviceType == kOTSerialDevice && 
                    (portRecord.fInfoFlags & kOTPortIsAlias) == 0) {
                err = PrintSerialPortInfo (&portRecord);
            }
        }
        portIndex += 1;
    } while (portValid && err == kOTNoError);
    return err;
}

?/TD>

èdóvÅF
PowerPCÉRÉìÉsÉÖÅ[É^è„Ç≈ÇÕÅAOTGetUserPortNameFromPortRef ()ÇÕ68KÇÃÉvÉçÉOÉâÉÄÇ©ÇÁóòópÇ≈Ç´Ç‹ÇπÇÒÅBè⁄ǵÇ≠ÇÕDTS Q&A NW 48 "68K Open Transport Code on Power Macintoshes"ÇÇ≤óóâ∫Ç≥Ç¢ÅB


Open Transport 1.1.1à»ç~Ç≈ÇÕÅACRMÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÕé©ìÆìIÇ…Open TransportÇÃÉVÉäÉAÉãÉ|Å[ÉgÇΔǵǃLJìoò^Ç≥ÇÍÇ‹Ç∑ÅBè]ǡǃÅAì‡ë†ÉVÉäÉAÉãÉ|Å[ÉgÇΔÉTÅ[ÉhÉpÅ[ÉeÉBÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÕè„ãLÇÃÉTÉìÉvÉãÉRÅ[ÉhÇ…ÇÊǡǃîFéØÇ≥ÇÍÇ‹Ç∑ÅBGestalt ()ä÷êîÇégǶnjÅAÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈOpen TransportÇÃÉoÅ[ÉWÉáÉìÇ™ìæÇÁÇÍÇ‹Ç∑ÅBè⁄ǵÇ≠ÇÕDTS Q&A NW 41 "Gestalt Selectors for Mac Networking"ÇÇ≤óóâ∫Ç≥Ç¢ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉIÅ[ÉvÉì

égópÇ∑ÇÈÉVÉäÉAÉãÉ|Å[ÉgÇåàÇflÇΩÇÁÅAOTOpenEndpoint ()Ç≈ǪÇÃÉVÉäÉAÉãÉ|Å[ÉgÇ…ëŒÇ∑ÇÈÉGÉìÉhÉ|ÉCÉìÉgÇçÏê¨ÇµÇ‹Ç∑ÅBDZÇÃéûì_Ç≈ÉVÉäÉAÉãÉhÉâÉCÉoÇÕÇ‹ÇæÉIÅ[ÉvÉìÇ≥ÇÍǻǢÇÃÇ≈à¿êSÇ≈Ç∑ÅBOpen TransportÇÕÅAÉGÉìÉhÉ|ÉCÉìÉgÇé¿ç€Ç…ê⁄ë±Ç∑ÇÈÇ‹Ç≈ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇÉIÅ[ÉvÉìǵNjÇπÇÒÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇïÅí Ç…égópÇ∑ÇÈÇ…ÇÕqlen = 0Ç≈OTBind ()ÇåƒÇ—èoǵǃÅAà¯Ç´ë±Ç´OTConnect ()ÇåƒÇ—èoǵNjÇ∑ÅBÉVÉäÉAÉãÉ|Å[ÉgÇÕOTConnect ()ÇåƒÇ—èoÇ∑Ç‹Ç≈ÉIÅ[ÉvÉìÇ≥ÇÍÇ‹ÇπÇÒÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…égópÇ∑ÇÈèÍçáÇÕqlen = 1Ç≈OTBind ()ÇåƒÇ—èoǵNjÇ∑ÅBDZÇÃèÍçáÅAÉVÉäÉAÉãÉ|Å[ÉgÇÕÇ∑ÇÆÇ…ÉIÅ[ÉvÉìÇ≥ÇÍÇ‹Ç∑ÅBǪǵǃÅAÉVÉäÉAÉãÉ|Å[ÉgåoóRÇ≈ÉfÅ[É^Ç™ëóÇÁÇÍǃÇ≠ÇÈÇΔÅAÉRÅ[ÉãÉoÉbÉNä÷êîÇ…T_LISTENÉCÉxÉìÉgÇ™ëóêMÇ≥ÇÍÇ‹Ç∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈèÍçáÇÕÅAÉVÉäÉAÉãÉ|Å[ÉgÇ…ä÷Ç∑ÇÈèdóvÇ»í ímÇéÛÇØÇÈÇΩÇflÅAOTRegisterAsClient ()ÇåƒÇ—èoǵǃOpen TransportÇÃÉNÉâÉCÉGÉìÉgÇΔǵǃÉvÉçÉOÉâÉÄÇìoò^ǵǃâ∫Ç≥Ç¢ÅBãÔëÃìIÇ…ÇÕÅAkOTYieldPortRequestÅiÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈÇéQèΔÅjÅAkOTProviderIsDisconnectedÅAkOTProviderIsReconnectedÇÃí ímÇìKêÿÇ…èàóùÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇÃÉNÉçÅ[ÉY

ÉVÉäÉAÉãÉ|Å[ÉgÇégÇ¢èIÇÌÇ¡ÇΩÇÁÅAïKÇ∏ÉNÉçÅ[ÉYǵǃâ∫Ç≥Ç¢ÅBÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇ™é¿ç€Ç…ÉNÉçÅ[ÉYÇ≥ÇÍÇÈÉ^ÉCÉ~ÉìÉOÇÕÅAÉVÉäÉAÉãÉ|Å[ÉgÇÉIÅ[ÉvÉìǵÇΩï˚ñ@Ç…ç∂âEÇ≥ÇÍÇ‹Ç∑ÅB

í èÌÇÕOTSndDisconnect ()Ç≈ê⁄ë±ÇâèúǵNjÇ∑ÅiÉGÉìÉhÉ|ÉCÉìÉgÇÕT_IDLEèÛë‘Ç…Ç»ÇËÇ‹Ç∑ÅjÅB

éÛêgìIÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵǃǢÇÈèÍçáÇÕÅAOTUnbind ()Ç≈ÉoÉCÉìÉhÇ™âèúǵNjÇ∑ÅB

Ç‹ÇΩÅAOTCloseProvider ()Ç≈ÉGÉìÉhÉ|ÉCÉìÉgÇÉNÉçÅ[ÉYǵÇΩèÍçáLJÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇ™ÉNÉçÅ[ÉYÇ≥ÇÍÇ‹Ç∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇΔà·Ç¡ÇƒÅAOpen TransportÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵǃǢÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇèÌÇ…äƒéãǵǃǢNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇÃóòópíÜÇ…àŸèÌèIóπǵÇΩèÍçáÇ≈LJÅAÉGÉìÉhÉ|ÉCÉìÉgÇΔÉVÉäÉAÉãÉ|Å[ÉgÇÃÉhÉâÉCÉoÇÕÇ∑Ç◊ǃÉNÉçÅ[ÉYÇ≥ÇÍÇ‹Ç∑ÅBÇΩÇæÇµÅAÉAÉvÉäÉPÅ[ÉVÉáÉìà»äOÅiÉRÅ[ÉhÉäÉ\Å[ÉXÇ‚ã§óLÉâÉCÉuÉâÉäÅjÇÕÉÅÉÇÉäÇ©ÇÁÉAÉìÉçÅ[ÉhÇ≥ÇÍÇÈëOÇ…ïKÇ∏CloseOpenTransport ()ÇåƒÇ—èoÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈ

èdóvÅF
DZDZÇ≈ÇÕOpen Transportè„Ç≈ÇÃÉVÉäÉAÉãÉ|Å[Égä«óùÇÃñ{óàÇÃédëgÇâê‡ÇµÇƒÇ¢Ç‹Ç∑ÅBǵǩǵÅAOpen TransportÇÃç≈êVÉoÅ[ÉWÉáÉìÅiDZÇÃÉeÉbÉNÉmÅ[ÉgÇ™èëÇ©ÇÍÇΩéûÇÕ1.3ÅjÇÕÉoÉOǙdžÇËÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃä«óùǙǧNjÇ≠ìÆçÏǵNjÇπÇÒÅBÉAÉvÉäÉPÅ[ÉVÉáÉìë§Ç©ÇÁå©ÇÈÇΔÅAéÛêgìIÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵǃǢÇÈÉvÉçÉOÉâÉÄǙdžÇÈÇΔÅAó·Ç¶ÇªÇÃÉVÉäÉAÉãÉ|Å[ÉgÇ™égópâ¬î\Ç≈džǡǃLJÅAOTYieldPortRequest ()ÇÕèÌÇ…kBUSYErrÇï‘ǵNjÇ∑ÅB


ÉVÉäÉAÉãÉ|Å[ÉgÇÃãåAPIÇΔà·Ç¡ÇƒÅAOpen TransportÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[ÉVÉáÉìópÇÃAPIÇîıǶǃǢNjÇ∑ÅBÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[ÉVÉáÉìÇÕà»â∫ÇÃÇÊǧǻéËèáÇ≈çsÇÌÇÍÇ‹Ç∑ÅF

  1. ÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópÇ∑ÇÈÉvÉçÉOÉâÉÄÇÕÉVÉäÉAÉãÉ|Å[ÉgÇäJǢǃÅAqlen = 1Ç≈ÉoÉCÉìÉhǵNjÇ∑ÅBÇ∑ÇÈÇΔÅAäOïîÇ©ÇÁÇÃê⁄ë±Ç…ëŒÇµÇƒÅAë“ã@èÛë‘ÇΔÇ»ÇËÇ‹Ç∑ÅB

  2. ÉVÉäÉAÉãÉ|Å[ÉgÇí èÌÇ…óòópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕOTConnect ()Ç≈ÉVÉäÉAÉãÉ|Å[ÉgÇäJÇ´Ç‹Ç∑ÅBǵǩǵÅAë“ã@ǵǃǢÇÈÉvÉçÉOÉâÉÄÇ™ä˘Ç…ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵǃǢÇÈÇΩÇflÅAOTConnect ()ÇÕkBUSYErrÉGÉâÅ[Çï‘ǵNjÇ∑ÅB

  3. DZÇÃÉGÉâÅ[Ç…ëŒÇµÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕOTYieldPortRequest ()ÇåƒÇ—èoǵNjÇ∑ÅB

  4. Open TransportÇÕéwíËÇ≥ÇÍÇΩÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópǵǃǢÇÈÉvÉçÉOÉâÉÄÅiOTRegisterAsClient ()Ç≈ìoò^Ç≥ÇÍǃǢÇÈÉvÉçÉOÉâÉÄÇ…å¿ÇÈÅjÇ…kOTYieldPortRequestí ímÇëóÇËÇ‹Ç∑ÅB

  5. DZÇÃéûÅAë“ã@ǵǃǢÇÈÉvÉçÉOÉâÉÄÇÕÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈÇ©ÅAóvãÅÇãëî€Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

  6. ë“ã@ǵǃǢÇÈÉvÉçÉOÉâÉÄÇ™óvãÅÇãëî€ÇµÇΩèÍçáÅAOTYieldPortRequest ()ÇÕÉGÉâÅ[Çï‘ǵÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBDZÇÃéûÅAOTYieldPortRequest ()ÇÕÉVÉäÉAÉãÉ|Å[ÉgÇÃóòópÇãëî€ÇµÇΩÉvÉçÉOÉâÉÄñºÇΔãëî€óùóRÇÉäÉXÉgDžǵǃï‘ǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕDZÇÃèÓïÒÇ…äÓÇ√ǢǃÅuÉVÉäÉAÉãÉ|Å[ÉgégópíÜÅvÉ_ÉCÉAÉçÉOÇï\é¶Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

  7. ë“ã@ǵǃǢÇÈÉvÉçÉOÉâÉÄÇ™Ç∑Ç◊ǃÉVÉäÉAÉãÉ|Å[ÉgÇè˜Ç¡ÇΩèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃéûÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕì¡íËÇÃéûä‘ì‡ÅiÇ®ÇÊǪ10ïbÅjÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇäJÇ©Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅiqlen = 1Ç≈ÉoÉCÉìÉhÇ∑ÇÈÇ©ÅAOTConnect ()ÇåƒÇ—ÇæÇµÇ‹Ç∑ÅjÅBì¡íËéûä‘ì‡Ç…ÉVÉäÉAÉãÉ|Å[ÉgÇäJǩǻǢÇΔÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃóòópåèÇÕçƒÇ—ë“ã@ǵǃǢÇΩÉvÉçÉOÉâÉÄÇ…à⁄ÇËÇ‹Ç∑ÅB

  8. ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇäJÇ≠ÇΔÅAë“ã@ǵǃǢÇΩäeÉvÉçÉOÉâÉÄÇ…ÇÕkOTProviderIsDisconnectedí ímÇ™ëóÇÁÇÍÇ‹Ç∑ÅB

  9. ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇégÇ¢èIÇÌǡǃï¬Ç∂ÇÈÇΔÅAë“ã@ǵǃǢÇΩäeÉvÉçÉOÉâÉÄÇ…ÇÕkOTProviderIsReconnectedí ímÇ™ëóÇÁÇÍÇ‹Ç∑ÅB


è„ãLÇÃéËèáÇÕè≠ǵï°éGÇ≈Ç∑Ç™ÅAInside Macintosh: Open TransportÇ≈ÇÕè⁄ǵÇ≠âê‡Ç≥ÇÍǃǢNjÇ∑ÅB

óºÉAÅ[ÉrÉgÉåÅ[É^ÇÃï®åÍ

ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕMac OSÇÃíÜÇ≈ÇÕLJǡÇΔLJímÇÁÇÍǃǢǻǢïîï™ÇÃàÍǬÇΔåæÇ¶ÇÈǩLJǵÇÍÇ‹ÇπÇÒÅBàÍǬÇÃóùóRÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™Mac OSÇÃïWèÄÉCÉìÉXÉgÅ[ÉãÇ≈ÇÕÇ»Ç≠ÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇ…ÇÊǡǃÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍÇÈDZÇΔÇ≈Ç∑ÅBDZDZÇ≈ÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃèdóvê´ÇΔóºÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃã@î\DžǬǢǃâê‡ÇµÇ‹Ç∑ÅB

ñ‚ëËÇÃî≠í[

Mac OSÇÃÉfÉoÉCÉXÉ}ÉlÅ[ÉWÉÉÇÕå≥ÅXäÔñ≠Ç»ê›åvÇ™Ç≥ÇÍǃǢNjǵÇΩÅBì¡íËÇÃÉhÉâÉCÉoÇ™äJÇ©ÇÍÇÈÇΔÅAǪÇÃå„OpenDriver ()ÇÕǪÇÃÉhÉâÉCÉoÇÃrefNumÇï‘Ç∑ÇæÇØÇ≈ÅAÉhÉâÉCÉoë§Ç…ÇÕÇ»ÇÒÇÃí ímLJÇ≥ÇÍÇ‹ÇπÇÒÅBDZÇÍÇÕëΩÇ≠ÇÃÉhÉâÉCÉoÅió·Ç¶ÇŒÉtÉçÉbÉsÅ[ÉfÉBÉXÉNÉhÉâÉCÉoÅjÇ…ÇΔǡǃñ‚ëËÇΔÇ»ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAÉVÉäÉAÉãÉ|Å[ÉgÉhÉâÉCÉoÇÃÇÊǧDžÅAèÌÇ…àÍǬÇÃÉNÉâÉCÉGÉìÉgǵǩÉTÉ|Å[ÉgǵǻǢÉhÉâÉCÉoÇ…ÇΔǡǃÅAÉVÉäÉAÉãÉ|Å[ÉgÇÅuèäóLÅvÇ≈ǴǻǢêßå¿ÇÕëÂÇ´Ç»ñ‚ëËÇ≈Ç∑ÅB

MultiFinderÇÃìoèÍÇ‹Ç≈MacintoshÇÕàÍìxÇ…àÍǬÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìǵǩëñÇÁÇπÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÇ≈ǵÇΩÅBè]ǡǃÅAìÆçÏíÜÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇèäóLÇ∑ÇÈÉÇÉfÉãÇ™ê¨óßǵNjǵÇΩÅBǵǩǵÅAMultiFinderÇÃìoèÍÇ≈ï°êîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ìØéûÇ…ëñÇÈèÛãµÇΔÇ»ÇËÅAÉVÉäÉAÉãÉ|Å[ÉgÇÃèäóLñ‚ëËÇ™î≠ê∂ǵNjǵÇΩÅB

ñ‚ëËÇ÷ÇÃëŒâû

DZÇÃñ‚ëËÇ÷ÇÃëŒâûÇÕíPèÉÇ≈ǵÇΩÅBÉVÉäÉAÉãÉ|Å[ÉgÇ™ä˘Ç…äJǢǃǢÇÍÇŒÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™óòópǵǃǢÇÈÇΔåæÇ§Ç±ÇΔÇ»ÇÃÇ≈ÅADZÇÃèÍçáÇÕÉVÉäÉAÉãÉ|Å[ÉgÇÃégópÇçTǶÇÈDZÇΔÇ≈âåàǵNjǵÇΩÅBÉfÉoÉCÉXÇÃÉÜÉjÉbÉgÉeÅ[ÉuÉãÇíºê⁄éQèΔÇ∑ÇÈïKóvǙdžǡÇΩÇΩÇflÅAäÔóÌÇ»âåàçÙÇΔÇÕåæÇ¶Ç‹ÇπÇÒÇ≈ǵÇΩÇ™ÅAìÆçÏè„ÇÃñ‚ëËÇÕdžÇËÇ‹ÇπÇÒÇ≈ǵÇΩÅB

êVÇΩÇ»ñ‚ëË

AppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÃìoèÍÇ≈êVÇΩÇ»ñ‚ëËÇ™î≠ê∂ǵNjǵÇΩÅBAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÕÉoÉbÉNÉOÉâÉEÉìÉhÇ≈ë“ã@ǵÅAìdòbǙǩǩǡǃÇ≠ÇÈÇÃÇë“ÇøéÛÇØÇÈã@î\ǙdžÇËÇ‹Ç∑ÅBǵǩǵÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇ™ë“ã@ǵǃǢÇÈä‘ÇÕÅAÉVÉäÉAÉãÉ|Å[ÉgÇ™èÌÇ…égÇÌÇÍǃǢÇÈÇΩÇflÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÃë“ã@ÉÇÅ[ÉhÇêÿÇÁǻǢÇΔÅAÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈí èÌÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕóòópÇ≈Ç´Ç‹ÇπÇÒÇ≈ǵÇΩÅB

DZÇÃñ‚ëËÇÕÅAç≈èâÇÃñ‚ëËÇ÷ÇÃëŒâûçÙÇÃåãâ ÅAâåàÇ∑ÇÈDZÇΔÇ™îÒèÌÇ…ìÔǵÇ≠Ç»ÇËNjǵÇΩÅBè„ãLÇÃÉÇÉfÉãÇ…è]ǡǃê›åvÇ≥ÇÍÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉfÉoÉCÉXÇÃÉÜÉjÉbÉgÉeÅ[ÉuÉãÇÉ`ÉFÉbÉNÇ∑ÇÈÇÊǧDžǻÇËNjǵÇΩÇ™ÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇ™ä˘Ç…ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÇΩÇflÅADZÇÍÇÁÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉVÉäÉAÉãÉ|Å[ÉgÇégópíÜÇΔå©Ç»ÇµÅAOpenDriver ()LJåƒÇ—ÇæÇµÇ‹ÇπÇÒÅBAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÕÉVÉäÉAÉãÉ|Å[ÉgÇ™óòópÇ≥ÇÍÇÊǧÇΔǵǃǢÇÈDZÇΔÇä÷ímÇ≈ǴǻǢÇΩÇflÅAé©ìÆìIÇ…ë“ã@ÉÇÅ[ÉhÇêÿÇÈDZÇΔLJïsâ¬î\Ç≈ǵÇΩÅB

êVÇΩÇ»ñ‚ëËÇ÷ÇÃëŒâû

DZÇÃñ‚ëËDžǬǢǃÇÕ2íiäKÇÃëŒçÙÇ™ÇΔÇÁÇÍNjǵÇΩÅBÇ‹Ç∏ÅAÉfÉxÉçÉbÉpÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈç€ÇÃÉãÅ[ÉãÇ™ïœÇÌÇËNjǵÇΩÅBDZÇÃÉãÅ[ÉãÇÕè„ãLÇ≈LJèqÇ◊ÇÁÇÍǃǢNjÇ∑Ç™ÅADZDZÇ≈åJÇËï‘ǵNjÇ∑ÅB

ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™ë∂ç›Ç∑ÇÈèÍçáÇÕOpenDriver ()Çíºê⁄åƒÇ—èoǵǃÉVÉäÉAÉãÉ|Å[ÉgÇäJÇØÅBë∂ç›ÇµÇ»Ç¢èÍçáÇÕÉÜÉjÉbÉgÉeÅ[ÉuÉãÇéQèΔǵǃÅAÉhÉâÉCÉoÇ™ä˘Ç…äJǢǃǢǻǢèÍçáÇæÇØÉVÉäÉAÉãÉ|Å[ÉgÇäJÇØÅB

2Ǭñ⁄Ç…ÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇΔÇΔLJDžèoâ◊Ç≥ÇÍNjǵÇΩÅBÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕ_OpenÇΔ_CloseÇÉpÉbÉ`ǵǃÅAÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇäƒéãǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇäJÇ≠ÇΔÅAÉVÉäÉAÉãÉ|Å[ÉgÇÕǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèäóLï®ÇΔÇ»ÇËÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ìØÇ∂ÉVÉäÉAÉãÉ|Å[ÉgÇäJDZǧÇΔÇ∑ÇÈÇΔÅAÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕportInUseÉGÉâÅ[Çï‘ǵNjÇ∑ÅB

íêÅF
ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™ï‘Ç∑portInUseÉGÉâÅ[ÉRÅ[ÉhÇÕÉVÉäÉAÉãÉnÅ[ÉhÉEÉFÉAÇ™LocalTalkǻǫÇÃëºÇÃÉhÉâÉCÉoÇ≈égÇÌÇÍǃǢÇÈèÍçáÇ…ï‘Ç∑portInUseÇΔìØólÇ≈Ç∑ÅBÉGÉâÅ[ÉRÅ[ÉhÇÕìØÇ∂Ç≈LJÅAÉGÉâÅ[ÇÃèÛãµÇÕëÂÇ´Ç≠à·Ç¢Ç‹Ç∑ÅBÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃportInUseÇÕëºÉvÉçÉZÉXÇ…ÇÊÇÈÉVÉäÉAÉãÉ|Å[ÉgÇÃóòópÇà”ñ°ÇµÇ‹Ç∑ÅBÉVÉäÉAÉãÉhÉâÉCÉoÇÃportInUseÇÕÉVÉäÉAÉãÉnÅ[ÉhÉEÉFÉAÇ™ëºÇÃÉhÉâÉCÉoÇ…óòópÇ≥ÇÍǃǢÇÈDZÇΔÇà”ñ°ÇµÇ‹Ç∑ÅB


ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕAppleÉäÉÇÅ[ÉgÉAÉNÉZÉX1.0ÇÃàÍïîÇΔǵǃèâÇflǃèoâ◊Ç≥ÇÍNjǵÇΩÅBÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXÇÃLink Tool ManagerÇóòópǵǃǢNjÇ∑Ç™ÅALink Tool Manageré©ëÃÇÃAPIÇÕåˆäJÇ≥ÇÍǃǢNjÇπÇÒÅB

Ç≥ÇÁÇ…êVǵǢëŒçÙ

ÉRÉìÉsÉÖÅ[É^ãΔäEÇÕê√ìIǻLJÇÃÇ≈ÇÕǻǢÇÃÇ≈ÅAMac OSLJÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉXLJÉoÅ[ÉWÉáÉìÉAÉbÉvǵǃǢNjÇ∑ÅBAppleÉäÉÇÅ[ÉgÉAÉNÉZÉX3.0Ç≈ÇÕÅALink Tool ManagerÇΔÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Çñ≥Ç≠Ç∑ï˚å¸Ç≈ê›åvÇ≥ÇÍǃǢNjǵÇΩÅBǵǩǵÅAÉfÉxÉçÉbÉpÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç…äµÇÍǃǢÇΩÇΩÇflÅAǢǴǻÇËOpenDriver ()ÇåƒÇ—èoÇ∑ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ëΩêîdžÇËÅAÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Çñ≥Ç≠Ç∑ÇΔDZÇÍÇÁÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔê⁄êGǵǃǵNjǧã∞ÇÍdžÇËNjǵÇΩÅB

DZÇÃÇΩÇflÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉX3.0Ç…ÇÕâflãéÇÃÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃã@î\Çä‹ÇfiÅAêVǵǢÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÅiOpenTpt Serial ArbitratorÅjÇ™ì±ì¸Ç≥ÇÍNjǵÇΩÅBèâë„ÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇΔìØólÅA_OpenÇΔ_CloseÇÕÉpÉbÉ`Ç≥ÇÍǃǮÇËÅAÉVÉäÉAÉãÉ|Å[Égä«óùÇ™çsÇÌÇÍÇ‹Ç∑ÅBè]ǡǃÅAè„ãLÇÃÉãÅ[ÉãÇÕïœÇÌÇËÇ‹ÇπÇÒÅB

íêÅF
OpenTpt Serial ArbitratorÇÕOT/PPP 1.0Ç≈èâÇflǃìoèÍǵNjǵÇΩÅBǵǩǵÅAOT/PPPÇÕíPÇ…AppleÉäÉÇÅ[ÉgÉAÉNÉZÉX3.0ÇÃèkè¨î≈Ç»ÇÃÇ≈ÅADZDZÇ≈ÇÕìØìôÇÃÉ\ÉtÉgÉEÉFÉAÇΔå©Ç»ÇµÇ‹Ç∑ÅB

íêÅF
êVãåÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™óºï˚ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈèÍçáÇÕǫǧÇ≈ǵÇÂǧǩÅHïWèÄÇÃMac OS 8ÉCÉìÉXÉgÅ[ÉâÇ≈OT/PPPÇΔAppleÉäÉÇÅ[ÉgÉAÉNÉZÉX2.1Çóºï˚ÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈÇΔDZÇÃÇÊǧǻéñë‘Ç…Ç»ÇËÇ‹Ç∑ÅBìöǶÇÕÅAãåÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç™óDêÊÇ≥ÇÍÇ‹Ç∑ÅB

íêÅF
ãåÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Ç‚OpenTpt Serial ArbitratorÇÕÉvÉçÉZÉXÉ}ÉlÅ[ÉWÉÉÇÃóLñ≥ÇämîFÇ≥Ç∏Ç…ÅA_OpenÇÃÉpÉbÉ`ì‡Ç©ÇÁÉvÉçÉZÉXÉ}ÉlÅ[ÉWÉÉÇåƒÇ—èoǵǃǢNjǵÇΩÅBåãâ ÇΔǵǃÅAãNìÆéûÇ…ã@î\ägí£Ç™ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵÇÊǧÇΔÇ∑ÇÈÇΔÅAÉVÉXÉeÉÄÇ™ÉNÉâÉbÉVÉÖǵǃǵNjǢNjǵÇΩÅBDZÇÃÉoÉOÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÃóºÉoÅ[ÉWÉáÉìDžǮǢǃíºÇ≥ÇÍǃǢNjÇ∑ÅB


écÇÈñ‚ëË

Mac OSÇÕÇ‹ÇæÉVÉäÉAÉãÉ|Å[Égã…äyÇ…ìûíBǵǃǢNjÇπÇÒÅBOpenTpt Serial ArbitratorÇ…ÇÕÇ¢Ç≠ǬǩÇÃñ‚ëËì_Ç™écǡǃǢNjÇ∑ÅB

  • ÉVÉäÉAÉãÉ|Å[ÉgÇÃèäóLé“ÇÕProcessSerialNumberÅiè⁄ç◊DžǬǢǃÇÕInside Macintosh: ProcessesÇéQèΔÅjÇégǡǃä«óùÇ≥ÇÍÇ‹Ç∑Ç™ÅADZÇÍÇÕîÒÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉvÉçÉOÉâÉÄÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵÇΩèÍçáÇ…ñ‚ëËÇΔÇ»ÇËÇ‹Ç∑ÅBó·Ç¶ÇŒÅASystemTaskÇÉpÉbÉ`ǵǃÅAÉpÉbÉ`ì‡ïîÇ©ÇÁÉVÉäÉAÉãÉ|Å[ÉgÇêîï™óòópǵÇΩÇΔǵNjÇ∑ÅBÉVÉäÉAÉãÉ|Å[ÉgÇäJÇ¢ÇΩéûÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìAÇÃÉRÉìÉeÉNÉXÉgì‡Ç≈džǡǃLJÅAï¬Ç∂ÇΩéûÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìBÇÃÉRÉìÉeÉNÉXÉgì‡Ç©Ç‡ÇµÇÍÇ‹ÇπÇÒÅBDZÇÍÇÕÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^Çç¨óêÇ≥ÇπÇ‹Ç∑ÅB

  • ãåÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇΔOpenTpt Serial Arbitratorä‘ÇÕå¿ÇÁÇÍÇΩÇ‚ÇËéÊÇËǵǩÇ≥ÇÍÇ‹ÇπÇÒÅBDZÇÃÇΩÇflÅAOpen TransportÇ≈ÉVÉäÉAÉãÉ|Å[ÉgÇéÛêgìIÇ…óòópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAãåAPIÅiOpenDriver ()ÅjÇ≈ÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÉVÉäÉAÉãÉ|Å[ÉgÇè˜ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅB

  • è„ãLÇÃêßå¿ÇÃÇΩÇflÅAAppleÉäÉÇÅ[ÉgÉAÉNÉZÉX3.0Ç™ÉVÉäÉAÉãÉ|Å[ÉgÇóòópǵǃǢÇÈä‘ÇÕÅAZ-TermǻǫÇÃãåÉVÉäÉAÉãÉ|Å[ÉgAPIÇóòópǵǃǢÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉVÉäÉAÉãÉ|Å[ÉgÇóòópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅB

  • Open TransportÇÃÉVÉäÉAÉãÉ|Å[ÉgÉAÅ[ÉrÉgÉåÅ[É^ÇÕÉoÉOÇÃÇΩÇflÅAê≥ǵÇ≠ìÆçÏǵNjÇπÇÒÅBǵǩǵÅAçKÇ¢APIÇåƒÇ—èoÇ∑ÇÃÇÕà¿ëSÇ»ÇÃÇ≈ÅAOpen TransportǙǢÇ∏ÇÍíºÇÈDZÇΔÇå©âzǵǃÅAAPIÇóòópÇ∑ÇÈDZÇΔÇä©ÇflÇ‹Ç∑ÅB

DZÇÃÉeÉbÉNÉmÅ[ÉgÇÕè„ãLÇÃñ‚ëËDžǬǢǃëŒâûÇ™Ç≥ÇÍÇÈÇΔÇΔLJDžçXêVǵǃǢÇ≠ó\íËÇ≈Ç∑ÅB

óvñÒ

Mac OSÇÃÉVÉäÉAÉãÉ|Å[ÉgÇÕǧNjÇ≠ÉvÉçÉOÉâÉÄä‘Ç≈ã§óLÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÉVÉäÉAÉãÉ|Å[ÉgÇÃê^ÇÃèäóLé“ÇÕÉÜÅ[ÉUÇ≈Ç∑Ç™ÅAÉvÉçÉOÉâÉÄìØémÇ™ÉVÉäÉAÉãÉ|Å[ÉgÇǧNjÇ≠óòópǵǻǢÇΔÉÜÅ[ÉUÇÕïsñûÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈èqÇ◊ÇÁÇÍǃǢÇÈÉãÅ[ÉãÇ…è]ǶnjÅAÉRÉìÉsÉÖÅ[É^ÇÃóòópâ¬î\Ç»ÉVÉäÉAÉãÉ|Å[ÉgÇê≥ǵÇ≠îFéØÇµÅAëºÉvÉçÉOÉâÉÄÇΔLJǧNjÇ≠ã§ë∂Ç≈Ç´ÅAê¢äEíÜÇÃMacintoshÉÜÅ[ÉUÇ…à§Ç≥ÇÍÇÈDZÇΔÇ≈ǵÇÂǧÅB

éQçlï∂å£